package projeto;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

public class Sistema {

	private List<User> users = new ArrayList<User>();
	private List<String> tipos = new ArrayList<String>();

	public Sistema(){
	}

	public void cadastraUser(String nome, String email,String senha){
		User newUser = new User(nome, email,senha);
		this.users.add(newUser);
	}

	public boolean login(String email,String senha){
		return ConfirmaLogin(email,senha);
	}
	
	private boolean ConfirmaLogin(String email,String senha){
		for(User user: this.users){
			if(user.getEmail().equals(email)){
				if(user.getSenha().equals(senha)){
					return true;
				}else{
				return false;
				}
			} 
		}return false;
	}
	public boolean pesquisaUser(String email){
		for (User user : this.users){
			if (user.getEmail().equals(email)){
				return true;
			}
		}
		return false;
	}

	public List<BabyName> filtraPorTipo(List<String> tipos, String tag) throws Exception{
		List<BabyName> nomes = null;
		FileReader reader = new FileReader();
		for (String tipo : tipos){
			if (tipo.equals(tag)){
				reader.openFile(tag);
				nomes = reader.getNames();
			}
		}
		return nomes;
	}

	public List<BabyName> filtraPorGenero(List<BabyName> nomes, int g){
		List<BabyName> genero = new ArrayList<BabyName>();
		for (BabyName nome : nomes){
			if (nome.getGender() == g){
				genero.add(nome);
			}
		}
		return genero;
	}

	public void salvaSessao(User user, String id, HashMap<String, BabyName> nomes){
		Session novaSessao = new Session(nomes, id);
		user.adicionaSessao(novaSessao);
	}

	public List<BabyName> darNota(List<BabyName> nomes, List<Integer> notas){
		for (int i = 0; i < nomes.size(); i++){
			nomes.get(i).setGrade(notas.get(i));
		}
		return nomes;
	}

	private List<BabyName> comparaNotas(HashMap<Integer, List<BabyName>> mapNames){
		int checker, grade;
		List<BabyName> maxNotas = new ArrayList<BabyName>();
		List<BabyName> medNotas = new ArrayList<BabyName>();
		GradeComparator comparator = new GradeComparator();
		for (int i = 0; i < mapNames.get(0).size(); i++){
			checker = 0;
			grade = 0;
			for (int j = 0; j < mapNames.size() - 1; j ++){
				checker += comparator.compare(mapNames.get(j).get(i), mapNames.get(j + 1).get(i));
				grade = mapNames.get(j + 1).get(i).getGrade();
			}
			if (checker == 0 && grade > 0){
				if (grade == 2){
					maxNotas.add(mapNames.get(0).get(i));
				}
				else if (grade == 1){
					medNotas.add(mapNames.get(0).get(i));
				}
			}
		}
		if (maxNotas.size() > 0){
			return maxNotas;
		}
		return medNotas;
	}

	public BabyName criaSessao(User user, String id, int g, int numPessoas, String tag) throws Exception{
		HashMap<Integer, List<BabyName>> mapNames = new HashMap<Integer, List<BabyName>>();
		List<BabyName> names = filtraPorGenero((filtraPorTipo(tipos, tag)), g);
		List<BabyName> nomes = new ArrayList<BabyName>(names.size());
		List<Integer> notas;
		for (int i = 0; i < numPessoas; i++){
			notas = new ArrayList<Integer>(); 
			Collections.copy(nomes, names);
			mapNames.put(i, darNota(nomes, notas));
		}
		names = comparaNotas(mapNames);
		mapNames = new HashMap<Integer, List<BabyName>>();
		nomes = new ArrayList<BabyName>(names.size());
		for (int i = 0; i < numPessoas; i++){
			notas = new ArrayList<Integer>(); 
			Collections.copy(nomes, names);
			mapNames.put(i, darNota(nomes, notas));
		}
		return encontraMaisPopular(mapNames);
	}
	
	public BabyName encontraMaisPopular(HashMap<Integer, List<BabyName>> maisPopulares){
		List<BabyName> nomesOrdenados = new ArrayList<BabyName>();
		int soma;
		for (int i = 0; i < maisPopulares.size(); i++){
			soma = 0;
			for (int j = 0; j < maisPopulares.size(); i++){
				soma += maisPopulares.get(j).get(i).getGrade();
			}
			maisPopulares.get(i).get(i).setGrade(soma);
			nomesOrdenados.add(maisPopulares.get(i).get(i));
		}
		Collections.sort(nomesOrdenados, Collections.reverseOrder(new GradeComparator()));
		return nomesOrdenados.get(0);
	}
}
